package cade;

import static cade.Utils.copiarIndividuo;
import static cade.Utils.qtdSituacional;
import static cade.Utils.qtdVariaveis;

import java.util.Arrays;
public class Crencas {
	public static final int normativoMin = 0;
	public static final int normativoMax = 1;
	public static final int normativoMinFitness = 2;
	public static final int normativoMaxFitness = 3;

	public Individuo[] situacional;
	public double normativo[][];
	
	public double valorSituacional[]; //media de cada dimensao
	public double dominioSuperior[];
	public double dominioInferior[];

	public Crencas(int qtdSituacional, int qtdVariaveis, double[] limiteInferior, double[] limiteSuperior){
		this.situacional = new Individuo[qtdSituacional];
		this.normativo = new double[4][qtdVariaveis];
		
		this.dominioInferior = limiteInferior;
		this.dominioSuperior = limiteSuperior;
		
		this.valorSituacional= new double[qtdVariaveis];
	}

	public double getValorSituacional(int dimensao){
		return valorSituacional[dimensao];
	}

	public void calcularValorSituacional() {
		double valor;
		for(int j = 0; j < qtdVariaveis; j++){
			valor = 0;
			for(int i = 0; i < situacional.length; i++){
				valor += situacional[i].x[j];
			}

			valorSituacional[j] = valor/situacional.length;
		}
	}

	public void ajustar(Individuo[] aceitos, int qtdAceitos) {

		//Ajuste do Componente Situacional
		Arrays.sort(situacional);

		for(int j = 0; j < qtdAceitos; j++){			
			for(int i = qtdSituacional - 1; i >= 0; i--){
				if(aceitos[j].f < situacional[i].f){
					copiarIndividuo(aceitos[j], situacional[i]);
					break;
				}
			}
		}
		
		//Ajuste do Componente Normativo
		for(int j = 0; j < qtdVariaveis; j++){
			for(int i = 0; i < qtdAceitos; i++){
				
				if(aceitos[i].f < normativo[normativoMinFitness][j] || aceitos[i].x[j] <= normativo[normativoMin][j]){
					normativo[normativoMin][j] = aceitos[i].x[j];
					normativo[normativoMinFitness][j] = aceitos[i].f;
				}
				
				if(aceitos[i].f < normativo[normativoMaxFitness][j] || aceitos[i].x[j] >= normativo[normativoMax][j]){
					normativo[normativoMax][j] = aceitos[i].x[j];
					normativo[normativoMaxFitness][j] = aceitos[i].f;
				}
				
			}
		}
	}
}
